package com.koron.css2.newProjectCenter.impl.inforManag;

import cn.hutool.core.date.DateTime;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.koron.css2.ServerInterface;
import com.koron.css2.newProjectCenter.bean.query.PubUpMaterialTypeQueryBean;
import com.koron.css2.newProjectCenter.mapper.PubUpMaterialTypeMapper;
import com.koron.css2.newProjectCenter.vo.PubUpMaterialTypeListVO;
import com.koron.css2.serviceManage.bean.RequestBean;
import com.koron.css2.serviceManage.bean.UserInfoBean;
import com.koron.css2.serviceManage.utils.JsonUtils;
import com.koron.util.Constant;
import com.koron.util.Tools;
import org.apache.commons.lang3.StringUtils;
import org.koron.ebs.mybatis.SessionFactory;
import org.swan.PingYin;
import org.swan.bean.MessageBean;

import java.util.List;

/**
 * 材料仓库
 *
 * @author xs
 */
public class PubUpMaterialTypeList implements ServerInterface {

    @Override
    @SuppressWarnings("rawtypes")
    public MessageBean<?> exec(SessionFactory factory, UserInfoBean userInfo, RequestBean req) {
        try {
            // 将入参转换为QueryBean
            PubUpMaterialTypeQueryBean queryBean = JsonUtils.objectToPojo(req.getData(), PubUpMaterialTypeQueryBean.class);

            // 获取Mapper实例
            PubUpMaterialTypeMapper mapper = factory.getMapper(PubUpMaterialTypeMapper.class);

            // 修改或保存
            if (queryBean.getToDo() != null && queryBean.getToDo() == 2) {
                return updateOrSave(mapper, userInfo, queryBean);
            }

            // 删除
            if (queryBean.getToDo() != null && queryBean.getToDo() == 3) {
                return delete(mapper, queryBean);
            }

            // 设置分页参数
            PageHelper.startPage(queryBean.getPage(), queryBean.getPageCount());
            // 执行SQL
            List<PubUpMaterialTypeListVO> list = mapper.selectList(queryBean);

            // 判断是否有子级
            list.forEach(item -> {
                item.setHasChildren(mapper.getCountByCurrentId(item.getId()) > 0);
            });
            // 输出分页结果
            MessageBean<PageInfo> info = MessageBean.create(Constant.MESSAGE_INT_SUCCESS, "查询成功", PageInfo.class);
            info.setData(new PageInfo<>(list));
            return info;
        } catch (Exception e) {
            factory.close(false);
            logger.error("查询失败" + e.getMessage(), e);
            return MessageBean.create(Constant.MESSAGE_INT_FAIL, "查询失败", null);
        }
    }

    /**
     * 更新或保存上传材料类型信息
     *
     * @param thisMapper 数据映射器接口，用于执行数据库操作
     * @param userInfo   当前用户信息，用于记录操作者详情
     * @param queryBean  查询豆，包含需要更新或保存的数据信息
     * @return 返回一个MessageBean对象，包含操作结果信息
     */
    private MessageBean<?> updateOrSave(PubUpMaterialTypeMapper thisMapper, UserInfoBean userInfo, PubUpMaterialTypeQueryBean queryBean) {
        // 1. 检查查询豆中的ID是否为空，以决定是更新还是保存操作
        if (StringUtils.isEmpty(queryBean.getId())) {
            String parentId = queryBean.getParentId();
            // 2. 如果parent id为空，则根据名称生成code
            if (StringUtils.isEmpty(parentId)) {
                queryBean.setCode(PingYin.getInstance().getSelling(queryBean.getMaterialName(), true, "?") + "01");
            } else {
                // 2.1 如果不为空，则根据父级code以及子级数量生成新的code
                // 2.1.1 根据parent id获取子级数量
                int count = thisMapper.getCountByCurrentId(parentId);
                // 2.1.2 根据parent id获取当前父级code
                String code = thisMapper.getCodeById(parentId);
                queryBean.setCode(Tools.generateCode(code, count));
            }

            // 如果ID为空，设置新ID、创建者账号、创建时间和创建者名称，以及租户ID
            queryBean.setId(Tools.getObjectId());
            queryBean.setCreateAccount(userInfo.getUserInfo().getAcount());
            queryBean.setCreateTime(new DateTime());
            queryBean.setCreateName(userInfo.getUserInfo().getName());
            queryBean.setTenantId(userInfo.getCurWaterCode());
        } else {
            // 如果ID不为空，设置更新者账号、更新时间和更新者名称
            queryBean.setUpdateAccount(userInfo.getUserInfo().getAcount());
            queryBean.setUpdateTime(new DateTime());
            queryBean.setUpdateName(userInfo.getUserInfo().getName());
        }
        // 调用映射器的更新或保存方法，并获取操作影响的行数
        int num = thisMapper.updateOrSave(queryBean);
        // 创建一个成功消息豆，包含成功状态码、提示信息和数据类型
        MessageBean<Integer> info = MessageBean.create(Constant.MESSAGE_INT_SUCCESS, "保存成功", Integer.class);
        // 设置消息豆中的数据为影响的行数
        info.setData(num);
        // 返回包含操作结果的消息豆
        return info;
    }

    private MessageBean<?> delete(PubUpMaterialTypeMapper thisMapper, PubUpMaterialTypeQueryBean queryBean) {
        if (StringUtils.isEmpty(queryBean.getId())) {
            return MessageBean.create(Constant.MESSAGE_INT_FAIL, "主键id不能为空", null);
        }
        // 首先判断当前id下是否有子级，如有，不可删除
        if (thisMapper.getCountByCurrentId(queryBean.getId()) > 0) {
            return MessageBean.create(Constant.MESSAGE_INT_FAIL, "当前节点下有子级，不可删除", null);
        }
        // 判断当前节点下是否有材料
        if (thisMapper.getCountByMaterialTypeId(queryBean.getId()) > 0) {
            return MessageBean.create(Constant.MESSAGE_INT_FAIL, "当前节点下有材料，不可删除", null);
        }
        int num = thisMapper.delete(queryBean.getId());
        MessageBean<Integer> info = MessageBean.create(Constant.MESSAGE_INT_SUCCESS, "修改成功", Integer.class);
        info.setData(num);
        return info;
    }
}
